\chapter{Codigo Fonte da Aplicacao}
\label{ape:base}

Segue o codigo fonte da aplicacao desenvolvida 

\begin{lstlisting}[language=bash]
#!/bin/bash
#
# Instituto Federal de Educacao Ciencia e Tecnologia - IFPB
# Campus Campina Grande
# Curso Superior de Tecnologia em Telematica
#
# Trabalho de Conclusao de Curso - Seguranca e Administracao de Servidores Linux
# Jeosafa de Melo Freitas Junior - Matricula: 20072121022
#
#=============================================
# Metodo de Versionamento
# VERSaO X.X.X
#        | | |
#        | |  --> Pequenas Melhorias
#        |  --> Melhorias Significativas
#         --> Totalmente Funcional
#=============================================
#
# Versao 0.0.1 - Inicio da Codificacao
# Versao 0.0.2 - Tratamentos de Mensagens de linha de comando
# Versao 0.0.3 - Captura a Versao diretamento do cabecalho
# Versao 0.0.4 - Modularizacao atraves de Funcoes
# Versao 0.0.5 - Adicionando Menus
# Versao 0.1.0 - Adicionando arquivo de LOG
#

########## DECLARACOES DE FUNCOES ##########

#Funcao 00 - Verifica se um programa esta instalado ou nao
function check_install ()
{   
	if [ $(dpkg --get-selections | grep -w $1 | wc -l) -eq 0 ]
	then
		return 0 #Retorna 0 se o programa nao estiver instalado
	else
		return 1 # Retorna 1 caso contrario
	fi
}

#Funcao 01 - Verifica se o Usuario e ROOT
function verificaRoot(){
	if [ "$(id -u)" != "0" ]
		then 
	MENSAGEM_ERRO_ROOT="
ERRO DE EXECUCAO:
Este programa so podera executar todas as suas funcionalidades no modo super-usuaro.
Por favor, faca login com o super usuario e execute o $(basename "$0") novamente.
"
		echo "$MENSAGEM_ERRO_ROOT"
		echo "ERRO - "`date +%d/%m/%Y-%H:%M:%S`" - Usuario nao e ROOT" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
		exit 1
fi
}

#Funcao 02 - Verifica se o Dialog esta instalado no sistema
function verificaDialog(){
	check_install dialog
	if [ $? -eq 0 ]
	then
		MENSAGEM_ERRO_DIALOG="
O aplicativo Dialog e necessario a execucao e nao esta instalado no seu sistema.
Sem ele nao e possivel executar esta aplicacao. Deseja instalar o dialog para prosseguir com a execucao?[Y/n]
"
		echo "$MENSAGEM_ERRO_DIALOG"
		read resposta
		if [ $resposta = "Y"  -o $resposta = "y" ]
		then
			echo "Iniciando a Instalacao do Dialog!"
			apt-get -y install dialog
			echo "INSTALL - "`date +%d/%m/%Y-%H:%M:%S`" - INSTALOU DIALOG" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
			dialog --title 'Sucesso na Instalacao' --sleep 3 --infobox 'Dialog instalado com sucesso!\nAguarde...\nIniciando a Aplicacao ...\n' 0 0
		else
			MENSAGEM_ERRO_DIALOG="
ERRO DE EXECUcaO:			
Voce escolheu nao instalar o Dialog, se desejar executar o programa novamente,
responda Y para a pergunta anterior para a instalacao do Dialog e a correta execucao deste programa.
Saindo da Aplicacao
"
			echo "$MENSAGEM_ERRO_DIALOG"
			echo "ERRO - "`date +%d/%m/%Y-%H:%M:%S`" - Dialog Nao Instalado" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
			exit 1
		fi
	else
		echo "Dialog instalado"
	fi
}

#Funcao 03 - Instalacao OpenSSH-Server
function setOpenssh {
	while : ; do
		escolha_ssh=$(
		dialog --stdout  \
		--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
		--ok-label "Selecionar" --cancel-label "Voltar ao Menu Anterior" \
		--title "OPENSSH-SERVER - Servidor SSH" \
		--menu "Escolha uma das opcoes abaixo:" \
		0 0 0 \
		1 'Instalar o SSHSEREVR - Servidor SSH' \
		2 'Remover o SSHSEREVR - Servidor SSH')
		
		#Se Usuario pressionar ESC ou selecionar 'Voltar' o programa volta para a tela anterior
		[ $? -ne 0 ] && break
						
		case "$escolha_ssh" in
				
			1)
				clear
				echo -e "\n\n ========== Instalando/Verificando o OPENSSH-SERVER ========== \n\n"
				apt-get -y install openssh-server
				dialog --stdout  \
				--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
				--beep \
				--title "Sucesso" \
				--msgbox "O SSHSERVER ja esta instalado em seu sistema!" 0 0
				echo "SSHSERVER - "`date +%d/%m/%Y-%H:%M:%S`" - Instalando/Verificando OpenSSH-Server" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
				;;
				
			2)
				check_install openssh-server
				if [ $? -eq 0 ]
				then
					dialog --stdout  \
					--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
					--title "Remover SSHSERVER" \
					--msgbox "O OpenSSH-Server nao esta instalado no se sistema!" \
					0 0	
					echo "INFO - "`date +%d/%m/%Y-%H:%M:%S`" - Tentativa de Remover programa nao Instalado" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
				else
					dialog --stdout  \
					--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
					--title "Remover SSHSERVER" \
					--yesno "Deseja realmente remover o OpenSSH-Server do seu sistema?" \
					0 0
					if [ $? = 0 ]; then
						clear
						echo -e "\n\n ========== REMOVENDO o OPENSSH-SERVER ========== \n\n"
						apt-get -y --purge remove openssh-server
						echo "SSHSERVER - "`date +%d/%m/%Y-%H:%M:%S`" - OpenSSH-Server Removido do Sistema" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
						dialog --stdout  \
						--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
						--title "Remover SSHSERVER" \
						--msgbox "O OpenSSH-Server foi removido com sucesso do sistema" \
						0 0
					else
						dialog --stdout  \
						--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
						--title "Remover SSHSERVER" \
						--msgbox "Ok, o OpenSSH-Server continua instalado no sistema!" \
						0 0
						echo "INFO - "`date +%d/%m/%Y-%H:%M:%S`" - Usuario cancelou a operacao de remocao do OpenSSH-Server" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
					fi
				fi				
				;;	
		esac	
	done
}

#Funcao 04 - Menu NMAP
function nmapMenu(){
	while : ; do
		escolha_nmap=$(
		dialog --stdout  \
		--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
		--ok-label "Selecionar" --cancel-label "Voltar ao Menu Anterior" \
		--title "NMAP - Port Scanner" \
		--menu "Escolha uma das opcoes abaixo:" \
		0 0 0 \
		1 'Instalar o NMAP - Port Scanner' \
		2 'Varrer portas de um determinado Host')
		
		#Se Usuario pressionar ESC ou selecionar 'Voltar' o programa volta para a tela anterior
		[ $? -ne 0 ] && break
						
		case "$escolha_nmap" in
				
			1)
				clear
				echo -e "\n\n ========== Instalando/Verificando o NMAP ========== \n\n"
				apt-get -y install nmap
				dialog --stdout  \
				--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
				--beep \
				--title "Sucesso" \
				--msgbox "O NMAP ja esta instalado em seu sistema!" 0 0
				echo "NMAP - "`date +%d/%m/%Y-%H:%M:%S`" - Instalando/Verificando NMAP" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
				;;
				
			2)
				NMAP=$(dpkg --get-selections | grep nmap | wc -l)
				if [ $NMAP -eq 0 ]
				then
					echo "ERRO - "`date +%d/%m/%Y-%H:%M:%S`" - Varredura sem o NMAP esta instalado" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
					dialog --stdout  \
					--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
					--title "Impossivel fazer a Varredura" \
					--msgbox "O NMAP ainda nao esta instalado no seu sistema\nUtilize a tela anterior para a instalacao" \
					0 0									
				else								
					ip=$(
					dialog --stdout  \
					--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
					--title "NMAP - Varredura de Portas" \
					--inputbox "Digite o IP do host (Para esta maquina digite "localhost"):" \
					0 0)
					echo "NMAP - "`date +%d/%m/%Y-%H:%M:%S`" - Varredura no IP: $ip" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
					touch "TCC_IFPB_AUX_"`date +%H%d%m%Y`".log"
					clear
					echo "Aguarde a Varredura do IP: $ip"
					nmap "$ip" >> "TCC_IFPB_AUX_"`date +%H%d%m%Y`".log"
					dialog --stdout  \
					--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
					--title "NMAP - Resultado da Varredura no IP: $ip" \
					--textbox "TCC_IFPB_AUX_"`date +%H%d%m%Y`".log" \
					50 0	
					rm "TCC_IFPB_AUX_"`date +%H%d%m%Y`".log"
				fi
				;;	
		esac	
	done
}

# Funcao 05 - Menu CHKROOTKIT
function rootkitMenu() {
	while : ; do
		escolha_rootkit=$(
		dialog --stdout  \
		--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
		--ok-label "Selecionar" --cancel-label "Voltar ao Menu Anterior" \
		--title "CHKROOTKIT - Varre o sistema em Busca de RootKit" \
		--menu "Escolha uma das opcoes abaixo:" \
		0 0 0 \
		1 'Instalar o CHKROOTKIT - Rootkit Scanner' \
		2 'Varrer o sistema em busca de rootkits')
		
		#Se Usuario pressionar ESC ou selecionar 'Voltar' o programa volta para a tela anterior
		[ $? -ne 0 ] && break
						
		case "$escolha_rootkit" in
				
			1)
				clear
				echo -e "\n\n ========== Instalando/Verificando o CHKROOTKIT ========== \n\n"
				apt-get -y install nmap
				dialog --stdout  \
				--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
				--beep \
				--title "Sucesso" \
				--msgbox "O CHKROOTKIT ja esta instalado em seu sistema!" 0 0
				echo "CKHROOTKIT - "`date +%d/%m/%Y-%H:%M:%S`" - Instalando/Verificando CHKROOTKIT" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
				;;
				
			2)
				ROOTKIT=$(dpkg --get-selections | grep chkrootkit | wc -l)
				if [ $ROOTKIT -eq 0 ]
				then
					echo "ERRO - "`date +%d/%m/%Y-%H:%M:%S`" - Varredura no sistema sem o CHKROOTKIT esta instalado" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
					dialog --stdout  \
					--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
					--title "Impossivel fazer a Varredura no Sistema" \
					--msgbox "O CHKROOTKIT ainda nao esta instalado no seu sistema\nUtilize a tela anterior para a instalacao" \
					0 0									
				else													
					echo "CHKROOTKIT - "`date +%d/%m/%Y-%H:%M:%S`" - Varredura no Sistema em busca de Rootkits" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
					touch "TCC_IFPB_ROOTKIT_"`date +%H%d%m%Y`".log"
					clear
					echo "Aguarde a Varredura do Sistema - CHKROOTKIT"
					chkrootkit >> "TCC_IFPB_ROOTKIT_"`date +%H%d%m%Y`".log"
					dialog --stdout  \
					--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
					--title "CHKROOTKIT - Resultado da Varredura" \
					--textbox "TCC_IFPB_ROOTKIT_"`date +%H%d%m%Y`".log" \
					50 0					
					dialog --stdout  \
					--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
					--title "Varredura Finalizada!" \
					--yesno "Deseja apagar o arquivo de log gerado para o CHKROOTKIT?" \
					0 0
					if [ $? = 0 ]; then
						rm "TCC_IFPB_ROOTKIT_"`date +%H%d%m%Y`".log"
						dialog --stdout  \
						--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
						--title "Log do CHKROOTKIT" \
						--msgbox "Arquivo de LOG APAGADO!" \
						0 0
					else
						dialog --stdout  \
						--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
						--title "Log do CHKROOTKIT" \
						--msgbox "Arquivo de LOG mantido" \
						0 0
						echo "CHKROOTKIT - "`date +%d/%m/%Y-%H:%M:%S`" - Arquivo de Log de Varredura Salvo" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
					fi
				fi
				;;	
		esac	
	done
}

########## FIM DAS DECLARAcoES DE FUNcoES ##########

########## INiCIO DA EXECUcaO ##########

#Verifica/Cria um arquivo de Log para a execucao do Programa
if test -f "TCC_IFPB_"`date +%H%d%m%Y`".log"
then
	echo "NEWEXE - "`date +%d/%m/%Y-%H:%M:%S`" - NOVA EXECUcaO DO PROGRAMA " >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
else 
	touch "TCC_IFPB_"`date +%H%d%m%Y`".log"
fi

#Verifica se o usuario e root

verificaRoot

#Tratando Opcoes da linha de Comando

MENSAGEM_USO="
Uso: $(basename "$0") [-h | -v ]

-h , --help		Mostra essa ajuda e sai
-v , --version	Mostra a versao do programa
"

case "$1" in
	-h | --help)
		echo "$MENSAGEM_USO"
		exit 0
	;;
	
	-v | --version)
		echo -n $(basename "$0") -
		#Extrai a versao diretamante do cabecalho do programa
		grep '^# Versao ' "$0" | tail -1 | cut -d - -f 1 | tr -d \#
		exit 0
	;;
	*)
		if test -n "$1"
		then
			echo Opcao Invalida: $1
			echo "Escolha '$(basename "$0") -h' ou '$(basename "$0") --help' para obter ajuda"
			exit 1
		fi
	;;
esac

#Verifica se o dialog esta instalado

verificaDialog

#Processamento

dialog --backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022"  \
	--msgbox "Bem vindo ao nosso aplicativo para administracao de Servidores GNU/Linux" 0 0

echo "INFO - "`date +%d/%m/%Y-%H:%M:%S`" - Iniciando a Execucao do Script" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
	
while : ; do
	# Menu Inicial do Programa
	escolha=$(
		dialog --stdout  \
			--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
			--ok-label "Selecionar" --cancel-label "Sair do Programa" \
			--title "Menu Inicial" \
			--menu "Bem vindo, escolha uma categoria abaixo:" \
			0 0 0 \
			1 'Instalacao de Servicos no Servidor' \
			2 'Instalar/Utilizar de Ferramentas de Seguranca' \
			3 'Atualizar o Repositorio Local' \
			4 'Sobre o Programa' \
			5 'Sair do Programa' )
			
	#Se Usuario pressionar ESC ou selecionar 'Cancelar' o programa encerra
	[ $? -ne 0 ] && break
		
	case "$escolha" in 
		1)	while : ; do
				escolha_fas=$(
					dialog --stdout  \
					--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
					--ok-label "Selecionar" --cancel-label "Voltar ao Menu Inicial" \
					--title "Ferramentas de Administracao de Servidores" \
					--menu "Escolha uma das ferramentas abaixo:" \
					0 0 0 \
					1 'OPENSSH-SERVER - Servidor para conexoes SSH' \
					2 'LAMP SERVER - Apache/Mysql/PHP' \
					3 'POSTGREESQL - Banco de dados' \
					4 'WEBMIN - Administracao com interface web de Servidores')
				
				#Se Usuario pressionar ESC ou selecionar 'Voltar' o programa volta para o menu principal
				[ $? -ne 0 ] && break
				
				case "$escolha_fas" in
					1)
						setOpenssh
					;;
					
					2) 
						rootkitMenu						
					;;
				
				esac #Fim do case de Ferramentas de Seguranca
			done #Fim do while de Ferramentas de Seguranca
			;;
			
		2)	while : ; do
				escolha_fss=$(
					dialog --stdout  \
					--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
					--ok-label "Selecionar" --cancel-label "Voltar ao Menu Inicial" \
					--title "Ferramentas de Seguranca de Servidores" \
					--menu "Escolha uma das ferramentas abaixo:" \
					0 0 0 \
					1 'NMAP - Scanner de Portas em um determinado host' \
					2 'CHKROOTKIT - Procura por Root Kits no Sistema')
				
				#Se Usuario pressionar ESC ou selecionar 'Voltar' o programa volta para o menu principal
				[ $? -ne 0 ] && break
				
				case "$escolha_fss" in
					1)
						nmapMenu
					;;
					
					2) 
						rootkitMenu						
					;;
				
				esac #Fim do case de Ferramentas de Seguranca
			done #Fim do while de Ferramentas de Seguranca
			;;
		
		3)
			clear
			echo -e "\n\n ========== Atualizando o Repositorio Local ========== \n\n"
			apt-get update
			dialog --stdout  \
				--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
				--beep \
				--title "Sucesso" \
				--msgbox "O Repositorio esta atualizado!" 0 0
			echo "INFO - "`date +%d/%m/%Y-%H:%M:%S`" - Repositorio Local do Sistema Atualizado m" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
		;;
			
		4) 
			dialog --stdout  \
			--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
			--cr-wrap \
			--title "Sobre o Sistema" \
			--msgbox "
			Instituto Federal de Educacao Ciencia e Tecnologia - IFPB
			Campus Campina Grande
			Curso Superior de Tecnologia em Telematica

			Trabalho de Conclusao de Curso - Seguranca e Administracao de Servidores Linux
			Jeosafa de Melo Freitas Júnior - Matricula: 20072121022
			" 0 0
			echo "INFO - "`date +%d/%m/%Y-%H:%M:%S`" - Mostrando a Tela Sobre o Sistema" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
		
		;;
		
		5) break ;;
	esac
done
dialog --stdout  \
	--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
	--title "Saindo do Sistema!" \
	--yesno "Deseja apagar os arquivos de log gerados?" \
	0 0
if [ $? = 0 ]; then
	rm "TCC_IFPB_"`date +%H%d%m%Y`".log"
	dialog --stdout  \
	--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
	--title "Saindo do Sistema!" \
	--msgbox "Arquivos de LOG APAGADOS!\nObrigado por utilizar o nosso Sistema!" \
	0 0
else
	dialog --stdout  \
	--backtitle "IFPB - Trabalho de Conclusao de Curso - Telematica - CG - Jeosafa Freitas Jr - Mat.: 20072121022" \
	--title "Saindo do Sistema!" \
	--msgbox "Arquivos de LOG mantidos\nObrigado por utilizar o nosso Sistema!" \
	0 0
	echo "INFO - "`date +%d/%m/%Y-%H:%M:%S`" - Saindo do Sistema" >> "TCC_IFPB_"`date +%H%d%m%Y`".log"
fi
clear
\end{lstlisting}